---
title: 'MongoDB'
date: '2023-06-17'
summary: 'MongoDB 是一个开源的 文档型数据库，属于 NoSQL 数据库的一种。它使用灵活的文档模型来存储数据，适合处理半结构化和非结构化数据。MongoDB 的设计目标是提供高性能、高可用性和易扩展性，广泛应用于现代 Web 应用、大数据分析和实时数据处理等领域' 
images: ['https://pic.rmb.bdstatic.com/bjh/down/a58781051f145123a68c7da7184dc521.jpeg']
tags: 
 - SQLDB
---


### 安装
[MongoDB 官网](https://www.mongodb.com/)
[MongoDB 安装](https://blog.huixiangwuyou.com/react/#/node/mongodb/)就不再赘述，之前有实践说明过


### 核心特点
- 灵活的数据模型：MongoDB 使用灵活的文档模型来存储数据，每个文档可以包含不同的字段和数据类型，无需预先定义模式。
- 高性能：MongoDB 采用了内存映射文件（MMAP）的方式，将数据直接存储在内存中，提供快速的读写性能,支持索引、聚合管道和分片，能够高效处理大规模数据和高并发请求。
- 文档模型：MongoDB 使用 BSON（Binary JSON）格式存储数据，数据以文档的形式组织，类似于 JSON 对象。每个文档可以包含嵌套的结构，支持数组和子文档。
- 高可用性：通过副本集（Replica Set）实现数据冗余和自动故障转移。
- 水平扩展：通过分片（Sharding）支持数据的分布式存储，适合处理海量数据。
- 丰富的查询语言：支持复杂的查询、聚合操作和地理空间查询。
- 多语言支持：提供多种编程语言的驱动程序（如 Python、Java、Node.js 等）


### 核心概念
- 文档（Document）：MongoDB 中的数据以文档的形式存储，类似于 JSON 对象。每个文档可以包含不同的字段和数据类型。
  ``` json
  {
   "_id": ObjectId("64b8f1a2e4b0a1a2b3c4d5e6"),
   "name": "Alice",
   "age": 25,
   "address": {
     "city": "New York",
     "zip": "10001"
   },
   "hobbies": ["reading", "traveling"]
  }
  ```
- 集合（Collection）：类似于关系型数据库中的表，用于存储具有相似结构的文档。
  - 类似于关系型数据库中的表，用于存储文档。
  - 集合是无模式的，文档结构可以不同。
- 数据库（Database）：
  - 多个集合的容器，每个 MongoDB 实例可以包含多个数据库。
- _id 字段：
  - 每个文档都有一个唯一的 _id 字段，作为主键。如果没有提供，MongoDB 会自动生成一个 ObjectId。


### 数据模型
MongoDB 采用了灵活的文档模型来存储数据，每个文档可以包含不同的字段和数据类型，无需预先定义模式。这使得 MongoDB 非常适合处理半结构化和非结构化数据。
- 文档模型：MongoDB 使用 BSON（Binary JSON）格式存储数据，数据以文档的形式组织，类似于 JSON 对象。每个文档可以包含嵌套的结构，支持数组和子文档。

> MongoDB 的文档模型非常灵活，支持以下特性：

- 嵌套文档：文档中可以包含子文档。
- 数组：文档中可以存储数组。
- 动态字段：文档的字段可以动态添加或删除。
``` json
{
  "name": "Bob",
  "age": 30,
  "contact": {
    "email": "bob@example.com",
    "phone": "123-456-7890"
  },
  "skills": ["MongoDB", "Node.js", "JavaScript"]
}
```

### 查询语言
MongoDB 提供了丰富的查询语言，支持复杂的查询、聚合操作和地理空间查询。
- 基本查询：使用查询操作符（如 $eq、$gt、$lt 等）进行基本查询。
- 高级查询：使用聚合管道（Aggregation Pipeline）进行复杂的查询和分析。
- 地理空间查询：支持地理空间查询，如地理位置查询、距离查询等。
``` javascript
// 基本查询
db.collection.find({ "age": 30 })
// 投影 返回 name 和 age 字段
db.collection.find({ "age": { $gt: 30 } })
// 聚合查询
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$customer", total: { $sum: "$amount" } } }
]);

//支持单字段索引、复合索引、全文索引和地理空间索引。
db.users.createIndex({ age: 1 }); // 创建升序索引

```

[更多查询方式](https://blog.huixiangwuyou.com/react/#/node/mongodb/use_software)

<br/>

### 高可用性与扩展性

- 副本集（Replica Set）：
  - 副本集是 MongoDB 的高可用性解决方案,主节点负责写操作，从节点负责读操作和数据冗余。
  - 副本集由多个节点组成，其中一个节点为主节点（Primary），其他节点为从节点（Secondary）。
  - 主节点负责处理写操作，从节点负责处理读操作。
- 分片（Sharding）：
  - 分片是 MongoDB 的水平扩展解决方案，将数据分散存储在多个节点上，实现数据的分布式存储,通过分片键（Shard Key）决定数据分布。。
  - 每个分片都是一个独立的 MongoDB 实例，可以独立进行读写操作。
  - 分片集群由多个分片节点组成，每个分片节点负责存储一部分数据,适合处理海量数据和高并发场景。


### 适用场景  
MongoDB 适用于以下场景：

- 内容管理系统（CMS）：灵活的模式适合存储多变的文档数据。
- 实时分析：高效的查询和聚合操作适合实时数据分析。
- 物联网（IoT）：支持时间序列数据和高吞吐量写入。
- 社交网络：嵌套文档和数组适合存储复杂的用户关系和数据，存储用户生成的内容和社交关系。
- 移动应用：支持地理位置查询和地理位置索引。
- 缓存层：可以作为缓存数据库，替代 Redis 或 Memcached。
- 企业应用：支持复杂的查询和事务处理。


### 优缺点
- 优点：
  - 灵活的数据模型：MongoDB 采用灵活的文档模型，支持嵌套文档和数组，适合处理半结构化和非结构化数据。
  - 高性能：MongoDB 采用内存映射文件（MMAP）的方式，将数据直接存储在内存中，提供快速的读写性能。
  - 高可用性：通过副本集实现数据冗余和自动故障转移。
  -丰富的生态系统和社区支持。
- 缺点：
  - 数据一致性：由于数据模型的灵活性，可能会导致数据一致性问题。
  - 不支持复杂的事务处理：MongoDB 不支持复杂的事务处理，需要借助其他工具或解决方案。
  - 内存占用较高，适合大内存服务器。
  - 不支持事务（早期版本，4.0 以后支持多文档事务）。
  - 不支持 ACID 事务。

  
<br/>

[查看 node 使用方式](https://blog.huixiangwuyou.com/react/#/node/mongodb/LinkNode)


<br/>  

### 总结
MongoDB 是一个功能强大且灵活的文档型数据库，适合处理半结构化和非结构化数据。它的高性能、高可用性和易扩展性使其成为现代应用开发的热门选择。无论是小型项目还是大规模分布式系统，MongoDB 都能提供出色的支持。  